lib: add repo_checkout_filter function for better ergonomics
authorFelix Krull <f_krull@gmx.de>
Wed, 12 Jun 2019 18:38:46 +0000 (20:38 +0200)
committerColin Walters <walters@verbum.org>
Fri, 6 May 2022 16:53:54 +0000 (12:53 -0400)
rust-bindings/rust/src/repo_checkout_at_options.rs
rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs
rust-bindings/rust/tests/repo/checkout_at.rs

index 954a19fd12fe53a68100e33a0f16998a44b98e63..4d345d228cc97dfa10d514e6047f960eedb0ef35 100644 (file)
@@ -1,15 +1,13 @@
+use crate::{RepoCheckoutMode, RepoCheckoutOverwriteMode, RepoDevInoCache, SePolicy};
 use glib::translate::{Stash, ToGlib, ToGlibPtr};
 use glib_sys::gpointer;
 use libc::c_char;
 use ostree_sys::OstreeRepoCheckoutAtOptions;
-use std::path::{Path, PathBuf};
-use {Repo, RepoCheckoutFilterResult};
-use {RepoCheckoutMode, RepoCheckoutOverwriteMode};
-use {RepoDevInoCache, SePolicy};
+use std::path::PathBuf;
 
 mod repo_checkout_filter;
 
-pub use self::repo_checkout_filter::RepoCheckoutFilter;
+pub use self::repo_checkout_filter::{repo_checkout_filter, RepoCheckoutFilter};
 
 pub struct RepoCheckoutAtOptions {
     pub mode: RepoCheckoutMode,
@@ -91,6 +89,7 @@ impl<'a> ToGlibPtr<'a, *const OstreeRepoCheckoutAtOptions> for RepoCheckoutAtOpt
 #[cfg(test)]
 mod tests {
     use super::*;
+    use crate::RepoCheckoutFilterResult;
     use gio::{File, NONE_CANCELLABLE};
     use glib_sys::{gpointer, GFALSE, GTRUE};
     use ostree_sys::{
@@ -141,9 +140,7 @@ mod tests {
             force_copy_zerosized: true,
             subpath: Some("sub/path".into()),
             devino_to_csum_cache: Some(RepoDevInoCache::new()),
-            filter: Some(Box::new(|_repo, _path, _stat| {
-                RepoCheckoutFilterResult::Skip
-            })),
+            filter: repo_checkout_filter(|_repo, _path, _stat| RepoCheckoutFilterResult::Skip),
             sepolicy: Some(SePolicy::new(&File::new_for_path("a/b"), NONE_CANCELLABLE).unwrap()),
             sepolicy_prefix: Some("prefix".into()),
         };
index e74016ad01a063f156a9dd319d0b8961f6c13a2c..c4caac4bd3ca4ca60576ccfcd92f1ddd918dcf71 100644 (file)
@@ -7,6 +7,14 @@ use std::path::{Path, PathBuf};
 
 pub type RepoCheckoutFilter = Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
 
+pub fn repo_checkout_filter<F>(closure: F) -> Option<RepoCheckoutFilter>
+where
+    F: 'static,
+    F: Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult,
+{
+    Some(Box::new(closure))
+}
+
 unsafe extern "C" fn filter_trampoline(
     repo: *mut OstreeRepo,
     path: *const c_char,
index 27e4c97c436b0b8b2d918c50b3bc96d8b5146913..f0476f09996a74980d90958ca937242ac102469e 100644 (file)
@@ -62,9 +62,7 @@ fn should_checkout_at_with_options() {
                 force_copy: true,
                 force_copy_zerosized: true,
                 devino_to_csum_cache: Some(RepoDevInoCache::new()),
-                filter: Some(Box::new(|_repo, _path, _stat| {
-                    RepoCheckoutFilterResult::Allow
-                })),
+                filter: repo_checkout_filter(|_repo, _path, _stat| RepoCheckoutFilterResult::Allow),
                 ..Default::default()
             }),
             dirfd.as_raw_fd(),
@@ -88,13 +86,13 @@ fn should_checkout_at_with_filter() {
         .repo
         .checkout_at(
             Some(&RepoCheckoutAtOptions {
-                filter: Some(Box::new(|_repo, path, _stat| {
+                filter: repo_checkout_filter(|_repo, path, _stat| {
                     if let Some("testfile") = path.file_name().map(|s| s.to_str().unwrap()) {
                         RepoCheckoutFilterResult::Skip
                     } else {
                         RepoCheckoutFilterResult::Allow
                     }
-                })),
+                }),
                 ..Default::default()
             }),
             dirfd.as_raw_fd(),